<?php
header("Content-Type: text/html;charset=utf-8");

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/12
 * Time: 11:28
 */
class company
{
    public function haveMeeting($args)
    {
        echo 'asdasdasdasdSSSSSSSSS';
        var_dump($args);
    }
}

/**
 * Class staff
 * @User: yfl
 * @Time: 2017年10月12日 13:03:30
 * @description:可以获得类的注释
 */
 class staff
{
    private $args;
    private $obj;

    public function __construct($name,$age)
    {
        echo '通过反射可以取消构造方法的执行';
        $this->obj = new company();
    }

    public function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
//        var_dump($arguments);

        //写法一 调用方法传参
        if (is_callable(array($this->obj, $name))) {
            $this->obj->$name($arguments);
        }
        // 写法二
        if (is_callable(array($this->obj, $name))) {
            call_user_func_array(array($this->obj, $name), $arguments);
        }
    }

    public static function fun1()
    {
        echo __FUNCTION__;
    }

    private function fun3()
    {

    }

    public static function fun2()
    {
//        echo __FUNCTION__;
//        return 'asdasd';
    }

//    abstract public function func4();

}

//$staff = new staff();
//$staff->haveMeeting(array('a', 'v'));
$reflection = new ReflectionClass('staff');
$obj = $reflection->newInstanceArgs(array('Tom','25','China'));
//$obj = $reflection->newInstanceWithoutConstructor(); //通过反射可以取消构造方法的执行
echo '<pre>';
//查看类数据

//Reflection::export($reflection);
//ReflectionClass::export($reflection);
//var_dump($reflection->isInternal());//internal 里边的 内部的   检查类是否由扩展或核心在内部定义，与用户定义相反
//echo $reflection->getEndLine();//可以获得类的结束行s
//echo $reflection->getDocComment();//可以获得类的注释
//var_dump($reflection->getConstructor ());//可以获得类的构造方法
//var_dump($reflection->hasMethod  ('aaa’'));//这个没有得到结果
//var_dump($reflection->getMethod('aaa'));//
//$callFun=$reflection->getMethod('aaa')->invoke(null);  //这里参数为null的时候 调用的方法为静态方法才可以  如果参数为一个对象静态动态都可以的

//var_dump($reflection->isInstantiable());//检查类是否可实例化  抽象类不可以被实例化
//var_dump(is_object($reflection));
//var_dump($reflection->getFileName());  //获得类所在的文件真实路径"D:\phpstudy\WWW\study\classtest\call.php

//查看方法数据
//var_dump($reflection->getMethods()); //获得类里边所有的方法(包括私有和受保护的成员s)
foreach ($reflection->getMethods() as $index => $method) {
//  var_dump($method->getName());  //获得方法的名字
  echo '<br/>';
//    var_dump($method->isInternal());  //检查方法是否属于内部定义
//    var_dump($method->isAbstract());  //检查方法是否是抽象的方法
//    var_dump($method->isPublic());  //检查方法是否是public的方法
//    var_dump($method->isPrivate());  //检查方法是否是private的方法
//    var_dump($method->isStatic());  //检查方法是否是静态的方法
//    var_dump($method->isFinal());  //检查方法是否是Final的方法
//    var_dump($method->isConstructor());  //检查方法是否是构造方法
//    var_dump($method->isClosure());  //检查是否是匿名函数 (官方手册本函数还未编写文档，仅有参数列表)
//    var_dump($method->returnsReference());  //检查是否返回参考信息  (官方手册本函数还未编写文档，仅有参数列表)。
    echo '<br/>';
}

//获取构造函数参数情况


$method=$reflection->getMethod('__construct');
$dataArr=$method->getParameters();
//var_dump($dataArr);
foreach ($dataArr as $index => $item) {
    argsData($item);
}
function argsData(ReflectionParameter $args){
//  var_dump($args->getDeclaringClass());  //获得类的名字
//    var_dump($args->getName());  //获得参数的名字
//    var_dump($args->getClass());  // 返回值 null null
//    var_dump($args->getPosition());  //
//    var_dump(empty(null));
//    var_dump($args->isPassedByReference());
//    var_dump($args->isDefaultValueAvailable());  //检查参数是否有默认值
    var_dump($args->allowsNull());
  echo '<br/>';
}
//$reflectionMethod=new ReflectionMethod(new staff(1,2),'fun2');
//var_dump($reflectionMethod->getDeclaringClass()); //获得类的名字